【JS-task1】变量作用域

小课堂【郑州第34期】

分享人:安文杰

目录

1.背景介绍

2.知识剖析

3.常见问题

4.解决方案

5.编码实战

6.扩展思考

7.参考文献

8.更多讨论

1.背景介绍

一个变量的作用域是程序源代码中定义这个变量的区域。全局变量拥有全局作用域,在JS代码中的任何地方都是有定义的。

2.知识剖析

在函数体内声明的变量只在函数的体内有定义,他们是局部变量,作用域也是局部的,函数参数也是局部变量,它们只在函数体内有定义。
在函数体内,局部变量的优先级高于同名的全局变量。如果在函数内声明的一个局部变量或者函数参数中带有的变量和全局变量重名,那么全局变量就被局部变量所遮盖

3.常见问题

  • 全局变量污染
  • 变量声明混乱
  • 局部变量无法灵活使用
            
socpe="golbal";   //声明一个全局变量,甚至不用var来声明
function check(argument) {
    socpe="local";      //糟糕!我们刚修改了全局变量
    myscope="local";       //这里显示地申请了一个新的全局变量,而我的本意是声明局部变量。 
    var hello="kitty" ;       //只在函数内部起作用
    return [socpe,myscope];  //返回两个值
}
check()           //=>上面函数内的声明产生了副作用
scope               //=》"local":全局变量修改了
myscope            //=>"local":全局命名空间搞乱了
console.log(hello)  //undefined

            

4.解决方案

统一命名规范

            
socpe="golbal";   //声明一个全局变量,甚至不用var来声明
function check(argument) {
    var socpe_in="local";      //糟糕!我们刚修改了全局变量
    var myscope="local";       //这里显示地申请了一个新的全局变量,而我的本意是声明局部变量。 
    var hello="kitty";
    return [socpe,myscope];  //返回两个值

}
check()           //=>逻辑清晰
//如何访问 hello呢?

            

通过闭包


function check(){
    var hello="kitty";
    return  function f(){
        return hello;
        }
    }
check()();//=>ketty;
        

5.编码实战


function add() {
    var counter = 0;
    function plus() {counter += 1;}
    plus();    
    return counter; // 1
}            
        

var test = function () {
    var i = 0;
    return function () {
        return i++;
    }
};
var a = test();
a();    //0
a();    //1
a();    //2

6.扩展思考

还有哪些防止变量污染的办法?

闭包还有哪些作用?

7.参考文献

参考一W3cplus

参考二:《javascript权威指南》

8.更多讨论

讨论:

if和while等条件语句的变量是全局的还是私有的?

闭包的缺点

鸣谢

感谢大家观看

BY : 沁修 | 安文杰